package jvn.client.interfaces;

import java.rmi.RemoteException;

import jvn.client.JvnException;
import jvn.client.JvnObjectImpl;

public interface StateI {

	/**
	 * L'apps utilisateur demande le verrou read
	 * 
	 * @return
	 * @throws RemoteException
	 * @throws JvnException
	 */
	public StateI lockRead(JvnObjectImpl jvnObjectImpl) throws RemoteException, JvnException;

	/**
	 * L'apps utilisateur demande le verrou write
	 * 
	 * @return
	 * @throws RemoteException
	 * @throws JvnException
	 */
	public StateI lockWrite(JvnObjectImpl jvnObjectImpl) throws RemoteException, JvnException;

	/**
	 * Libération du dernier verrou prit.
	 * 
	 * @return
	 * @throws RemoteException
	 * @throws JvnException
	 */
	public StateI unlock(JvnObjectImpl jvnObjectImpl) throws RemoteException, JvnException;

	/**
	 * Le coordinateur demande une libération du verrou read.
	 * 
	 * @throws RemoteException
	 * @throws JvnException
	 */
	public StateI invalidateRead(JvnObjectImpl jvnObjectImpl) throws RemoteException, JvnException;

	/**
	 * Le coordinateur demande une libération du verrou write.
	 * 
	 * @throws RemoteException
	 * @throws JvnException
	 */
	public StateI invalidateWrite(JvnObjectImpl jvnObjectImpl) throws RemoteException, JvnException;

	/**
	 * Un autre systeme requiert le verrou en lecture.
	 * 
	 * @return
	 */
	public StateI invalidateWriterForReader(JvnObjectImpl jvnObjectImpl) throws RemoteException, JvnException;

}